/******************************************************************************
 * @file rd0ff_bsp_key_driver.c
 * @brief KEY驱动实现文件
 *
 * 详细描述：
 * - 功能1：实现KEY驱动的初始化函数
 * - 功能2：提供按键状态读取接口
 * - 功能3：实现驱动实例的创建和管理
 * - 功能4：包含参数验证和错误处理机制
 *
 * @author 陈泳行 | R&D Dept. | Jin Dou Aerospace 金斗航天
 * @date 2025-6-29
 * @version 1.0.0
 *
 * @version_history
 * - 1.0.0 (2025-6-29): 初始版本，实现基本功能
 *
 * @note 本文件依赖rd0ff_bsp_key_config.h配置文件
 * @warning 驱动初始化前必须确保HAL库已正确初始化
 ******************************************************************************/
#include "rd0ff_bsp_key_driver.h"

/**
 * @brief KEY驱动实例初始化函数
 *
 * 初始化KEY驱动实例，绑定硬件接口和系统函数，完成按键硬件的初始化。
 * 该函数是KEY驱动的入口点，必须在使用KEY功能前调用。
 *
 * @param self KEY驱动实例指针
 * @param key_hw KEY硬件接口结构体指针
 * @param time_base_ms 时基函数结构体指针（仅OS_SUPPORTING定义时有效）
 * @param os_delay_ms OS延迟函数结构体指针（仅OS_SUPPORTING定义时有效）
 *
 * @return key_driver_ret_t 操作结果状态码
 * @retval KEY_DRIVER_RET_OK 初始化成功
 * @retval KEY_DRIVER_RET_INVALID_PARAM 参数无效
 * @retval KEY_DRIVER_RET_ERROR 按键硬件初始化失败
 */
key_driver_ret_t key_driver_inst(  bsp_key_driver_t *self,
                                   key_hw_t       *key_hw
 #ifdef OS_SUPPIRTING
							,time_base_ms_t  *time_base_ms
							 ,os_delay_ms_t  *os_delay_ms
#endif
                                                          )
{
    key_driver_ret_t ret = KEY_DRIVER_RET_OK;

    // 1.判断是否是野指针
    if( NULL == self       ||
        NULL == key_hw     
#ifdef  OS_SUPPIRTING
        ||NULL == time_base_ms 
        ||NULL == os_delay_ms     
#endif
                              )

    {
        return KEY_DRIVER_RET_ERROR;
    }

    // 2.检查硬件是否初始化
    if( KEY_INIT == self->init_status )
    {
        return KEY_DRIVER_RET_BUSY;
    }

    // 3.设置KEY驱动实例的回调函数和参数
    self->p_key_hw        = key_hw;
#ifdef  OS_SUPPIRTING
    self->p_time_base_ms  = time_base_ms;
    self->p_os_time_delay = os_delay_ms; 
#endif

    // 4.初始化硬件
    self->p_key_hw->pf_key_init();
    self->init_status = KEY_INIT;
    return ret;
}

